package com.obelisco.vista.herramientas;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import javax.activation.DataHandler;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.Message.RecipientType;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.mail.util.ByteArrayDataSource;

import org.springframework.mail.javamail.JavaMailSenderImpl;

import com.obelisco.modelo.data.auxiliares.Archivo;
import com.obelisco.vista.componentes.IProcesadorReporte;
import com.obelisco.vista.componentes.ListaBase;
import com.obelisco.vista.plantillas.VentanaReporteSimple;

import net.sf.jasperreports.engine.JRException;

public class EmailUtils {

	private JavaMailSenderImpl mailSender;

	public void enviar(String de, String para, String asunto, String cuerpo, Archivo... archivosAdjuntos)
			throws MessagingException {
		MimeMessage mensaje = mailSender.createMimeMessage();
		Multipart multipart = new MimeMultipart();
		if (cuerpo != null) {
			MimeBodyPart html = new MimeBodyPart();
			html.setContent(cuerpo, "text/html");
			multipart.addBodyPart(html);
		}
		for (Archivo archivo : archivosAdjuntos) {
			MimeBodyPart archivoAdjunto = new MimeBodyPart();
			archivoAdjunto.setDataHandler(new DataHandler(new ByteArrayDataSource(archivo.getContenido(), archivo.getTipo())));
			archivoAdjunto.setFileName(archivo.getNombre());
			multipart.addBodyPart(archivoAdjunto);
		}
		mensaje.setContent(multipart);
		mensaje.setFrom(new InternetAddress(de));
		mensaje.addRecipient(RecipientType.TO, new InternetAddress(para));
		mensaje.setSubject(asunto);
		mailSender.send(mensaje);
	}
	
	public void enviar(List<Object> listaDeDatos, Map<String, Object> parametros, IProcesadorReporte procesadorReporte,
			String rutaArchivoReporte, String de, String para, String asunto, String cuerpo, Object objeto)
			throws JRException, IOException, MessagingException {
		Map<String, Object> parameters = ReporteUtils.agregarparametrosGenerales(parametros, objeto);
		if (listaDeDatos == null && !(objeto instanceof ListaBase)) {
			listaDeDatos = (List<Object>)parameters.get("listaParametros");
			if (listaDeDatos == null)
				listaDeDatos = new ArrayList<Object>(); 
			if (listaDeDatos.size() == 0) {
				if (!(objeto instanceof VentanaReporteSimple)) {
					listaDeDatos.add("nuevo");
				}
				else {
					listaDeDatos.add("");
				}
			}
		}
		else if (listaDeDatos == null) {
				listaDeDatos = new ArrayList<Object>();
				listaDeDatos.add(parameters);
		}
		if (listaDeDatos.size() >= 0 && (!(listaDeDatos.get(0) instanceof String) || !((String)listaDeDatos.get(0)).equals("")))
			enviar(de, para, asunto, cuerpo, ReporteUtils.construirArchivoPdf(rutaArchivoReporte, listaDeDatos, parameters));
	}

	public JavaMailSenderImpl getMailSender() {
		return mailSender;
	}

	public void setMailSender(JavaMailSenderImpl mailSender) {
		this.mailSender = mailSender;
	}
	
}
